home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / accents.c < prev    next >
Text File  |  1996-05-26  |  9KB  |  425 lines

  1. /*
  2.  * accents.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Routines de gestion des caractŠres accentu‚s et
  7.  * conversions de jeux de caractŠres:
  8.  *
  9.  * History:
  10.  * --------
  11.  * 23.05.94: Created by flanque
  12.  */
  13.  
  14.     #include "!OPTIONS.H"                /* Options de compilation */         
  15.     #define    THIS_FILE    "ACCENTS.C v1.00 - 03.95"
  16.           
  17. /*
  18.  * System headers:
  19.  */
  20.     #include    <stdio.h>
  21.     
  22. /*
  23.  * Custom headers:
  24.  */
  25.     #include    "SPEC_PU.H"
  26.     #include    "MINITEL.H"
  27.     #include    "REZO.H"
  28.  
  29.     /*
  30.      * ASC2VDT_EQU: Equivalence de caractŠre ASCII -> VIDEOTEX
  31.      */                           
  32.     typedef
  33.         struct            
  34.         {
  35.             char        c_ascii;
  36.             char        c_equ1;
  37.             char        c_equ2;
  38.             char        c_equ3;
  39.         }
  40.         ASC2VDT_EQU;
  41.     
  42.  
  43.     /*
  44.      * VDT2ASC_EQU: Equivalence de caractŠre VDT -> ASCII
  45.      */                           
  46.     typedef
  47.         struct            
  48.         {
  49.             char        c_vdt;
  50.             char        c_ascii;
  51.         }
  52.         VDT2ASC_EQU;
  53.  
  54. /*
  55.  * ------------------------ PROTOTYPES -------------------------
  56.  */
  57.     /*
  58.      * EXTernal prototypes:
  59.      */
  60.     void    ping( void );
  61.  
  62.     /*
  63.      * PUBlic INTernal prototypes:
  64.      */
  65.     char    *convert_Asc2Vdt(                 /* Out: Ptr sur tampon de caractŠres ‚quivalents */
  66.                             char    c_ascii );    /* In:  caractŠre … traduire */
  67.     char    convert_G2toAsc(                     /* Out: caractŠre ‚quivalent */
  68.                             char    c_ascii );    /* In:  caractŠre … traduire */
  69.     char    convert_Compose2Asc(             /* Out: caractŠre ‚quivalent */
  70.                             char    c_accent,    /* In:  accent … composer */
  71.                             char    c_car );        /* In:  caractŠre … composer */
  72.  
  73. /*
  74.  * ------------------------ VARIABLES -------------------------
  75.  */
  76.  
  77. /*
  78.  * Internal variables: 
  79.  */
  80.     /*
  81.      * Equivalences ASCII PC8 -> VDT:
  82.      */
  83.     static    ASC2VDT_EQU        M_Tasc2vdt[] =
  84.                     {
  85.                         128,        'C',        0,            0,            /* C c‚dille */
  86.                         '',        SS2,        TREMA,    'u',
  87.                         '‚',        SS2,        AIGU,        'e',
  88.                         'ƒ',        SS2,        CIRC,        'a',
  89.                         132,        SS2,        TREMA,    'a',
  90.                         '…',        SS2,        GRAVE,    'a',
  91.                         134,        'a',        0,            0,            /* a avec rond */
  92.                         '‡',        SS2,        CEDILLE,    'c',
  93.                         'ˆ',        SS2,        CIRC,        'e',
  94.                         '‰',        SS2,        TREMA,    'e',
  95.                         'Š',        SS2,        GRAVE,    'e',
  96.                         '‹',        SS2,        TREMA,    'i',
  97.                         'Œ',        SS2,        CIRC,        'i',
  98.                         141,        'i',        0,            0,            /* i grave */
  99.                         142,        'A',        0,            0,            /* A trema */
  100.                         143,        'A',        0,            0,            /* A rond */
  101.                         144,        'E',        0,            0,            /* E aigu */
  102.                         145,        'a',        0,            0,            /* ae */
  103.                         146,        'A',        0,            0,            /* AE */
  104.                         '“',        SS2,        CIRC,        'o',
  105.                         148,        SS2,        TREMA,    'o',        
  106.                         149,        'o',        0,            0,            /* o grave */
  107.                         '–',        SS2,        CIRC,        'u',
  108.                         151,        SS2,        GRAVE,    'u',
  109.                         152,        'y',        0,            0,            /* y trema */
  110.                         153,        'O',        0,            0,            /* O trema */
  111.                         154,        'U',        0,            0,            /* U trema */
  112.                         155,        'c',        0,            0,            /* symbole cent */
  113.                         'œ',        SS2,        LIVRE,    0,
  114.                         157,        'Y',        0,            0,            /* Yen */
  115. /* ATARI ONLY */    158,        SS2,        BETA,        0,
  116.                         159,        'f',        0,            0,            /* f inclin‚ */
  117.                         160,        'a',        0,            0,            /* a aigu */
  118.                         161,        'i',        0,            0,            /* i aigu */                        
  119.                         162,        'o',        0,            0,            /* o aigu */
  120.                         163,        'u',        0,            0,            /* u aigu */
  121.                         164,        'n',        0,            0,            /* n tilda */
  122.                         165,        'N',        0,            0,            /* N tilda */
  123.                         166,        'a',        0,            0,            /* a soulign‚ */
  124.                         167,        'o',        0,            0,            /* o soulign‚ */
  125.                         PC8_DEMI,        SS2,        DEMI,        0,            /* 1/2 */
  126.                         PC8_QUART,        SS2,        QUART,    0,            /* 1/4 */
  127.                         REZO_OE_MIN,    SS2,    OE_MIN,    0,
  128.                         REZO_OE_MAJ,    SS2,    OE_MAJ,    0,
  129.                         RESO_TRAIT_HAUT,        0x7E,    0,    0,
  130.                         RESO_TRAIT_HORIZ,        0x60,    0,    0,
  131.                         RESO_TRAIT_BAS,        0x5F, 0, 0,
  132.                         RESO_TRAIT_GAUCHE,    0x7B, 0,    0,
  133.                         RESO_TRAIT_VERT,        0x7C, 0, 0,
  134.                         RESO_TRAIT_DROIT,        0x7D, 0,    0,
  135.                         REZO_FLECHE_GAUCHE,    SS2,    FLECHE_GAUCHE, 0,
  136.                         REZO_FLECHE_HAUT,        SS2,    FLECHE_HAUT, 0,
  137.                         REZO_FLECHE_DROITE,    SS2,    FLECHE_DROITE, 0,
  138.                         REZO_FLECHE_BAS,        SS2,    FLECHE_BAS, 0,
  139.                         REZO_PARAGRAPHE,        SS2,    PARAGRPH, 0,
  140.                         PC8_BETA,    SS2,    BETA,        0,
  141.                         PC8_PLUSMOINS,    SS2,    PLUSMOINS,    0,    /* +- */
  142.                         PC8_DIVISE,    SS2,    DIVISE,    0,
  143.                         PC8_DEGRE,    SS2,    DEGRE,    0,
  144.                         '\0',        0,            0,            0
  145.                     };
  146.     static    int        M_nb_equivAsc2Vdt;        /* Nbre d'‚quivalences */
  147.     static    char        M_Tc_equiv[ 4 ];            /* Buffer ds lequel on ‚crir l'‚quivalence d'accent */
  148.  
  149.     static    VDT2ASC_EQU     M_TjeuG2[]=
  150.                     {
  151.                         LIVRE,            'œ',
  152.                         DOLLAR,            '$',
  153.                         DIESE,            '#',
  154.                         PARAGRPH,        REZO_PARAGRAPHE,
  155.                         FLECHE_GAUCHE,    REZO_FLECHE_GAUCHE,
  156.                         FLECHE_HAUT,    REZO_FLECHE_HAUT,
  157.                         FLECHE_DROITE,    REZO_FLECHE_DROITE,
  158.                         FLECHE_BAS,        REZO_FLECHE_BAS,
  159.                         DEGRE,            PC8_DEGRE,
  160.                         PLUSMOINS,        PC8_PLUSMOINS,
  161.                         DIVISE,            PC8_DIVISE,
  162.                         QUART,            PC8_QUART,
  163.                         DEMI,                PC8_DEMI,
  164.                         TROISQUARTS,    PC8_INVALID,
  165.                         OE_MAJ,            REZO_OE_MAJ,
  166.                         OE_MIN,            REZO_OE_MIN,
  167.                         BETA,                PC8_BETA,
  168.                         '\0',                0
  169.                     };
  170.     static    int        M_nb_equivVdt2Asc;        /* Nbre d'‚quivalences */
  171.  
  172. /*
  173.  * ------------------------ FUNCTIONS -------------------------
  174.  */
  175.  
  176. /*
  177.  * init_accents(-)
  178.  *
  179.  * Purpose:
  180.  * --------
  181.  * Init des routines d'accents
  182.  *
  183.  * Algorythm:
  184.  * ----------  
  185.  *    compte le nbre d'‚quivalences
  186.  *
  187.  * Notes:
  188.  * ------
  189.  *
  190.  * History:
  191.  * --------
  192.  * 23.05.94: fplanque: Created
  193.  */
  194. void    init_accents( void )
  195. {
  196.     M_nb_equivAsc2Vdt = 0;
  197.     while( M_Tasc2vdt[ M_nb_equivAsc2Vdt ] .c_ascii != '\0' )
  198.     {
  199.         M_nb_equivAsc2Vdt ++;
  200.     }
  201.  
  202.     M_nb_equivVdt2Asc = 0;
  203.     while( M_TjeuG2[ M_nb_equivVdt2Asc ] .c_ascii != '\0' )
  204.     {
  205.         M_nb_equivVdt2Asc ++;
  206.     }
  207.  
  208. }
  209.  
  210.  
  211. /*
  212.  * convert_Asc2Vdt(-)
  213.  *
  214.  * Purpose:
  215.  * --------
  216.  * Convertit un caractŠre ascii PC8 en vid‚otex
  217.  *
  218.  * Algorythm:
  219.  * ----------  
  220.  *    retourne car invalid si pas trouv‚.
  221.  *
  222.  * Suggest:
  223.  * --------
  224.  * On peut am‚liorer l'‚fficacit‚ avec un binary search
  225.  * NE GERE PAS LES CODES <128!  (FLECHES, BARRES...)
  226.  *
  227.  * History:
  228.  * --------
  229.  * 23.05.94: fplanque: Created
  230.  */
  231. char    *convert_Asc2Vdt(     /* Out: Ptr sur tampon de caractŠres ‚quivalents */
  232.             char    c_ascii )    /* In:  caractŠre … traduire */
  233. {
  234.     int     i;
  235.  
  236.     for( i=0; i < M_nb_equivAsc2Vdt; i++ )
  237.     {
  238.         if( M_Tasc2vdt[ i ] .c_ascii == c_ascii )
  239.         {
  240.             M_Tc_equiv[0] = M_Tasc2vdt[ i ] .c_equ1;
  241.             M_Tc_equiv[1] = M_Tasc2vdt[ i ] .c_equ2;
  242.             M_Tc_equiv[2] = M_Tasc2vdt[ i ] .c_equ3;
  243.             M_Tc_equiv[3] = '\0';
  244.             
  245.             return    M_Tc_equiv;        /* Ptr sur buffer */
  246.         }
  247.     }
  248.  
  249.     /*
  250.      * On a pas trouv‚:
  251.      */
  252.     M_Tc_equiv[0] = INVALID;
  253.     M_Tc_equiv[1] = '\0';
  254.     
  255.     return    M_Tc_equiv;        /* Ptr sur buffer */
  256.  
  257. }
  258.  
  259.  
  260.  
  261. /*
  262.  * convert_G2toAsc(-)
  263.  *
  264.  * Purpose:
  265.  * --------
  266.  * Convertit un caractŠre vid‚otex du jeu G2 en ascii
  267.  *
  268.  * Algorythm:
  269.  * ----------  
  270.  *    retourne car pc8_invalid si pas trouv‚.
  271.  *
  272.  * Suggest:
  273.  * --------
  274.  * On peut am‚liorer l'‚fficacit‚ avec un binary search
  275.  *
  276.  * History:
  277.  * --------
  278.  * 23.05.94: fplanque: Created
  279.  */
  280. char    convert_G2toAsc(         /* Out: caractŠre ‚quivalent */
  281.             char    c_vdt )        /* In:  caractŠre … traduire */
  282. {
  283.     int     i;
  284.  
  285.     for( i=0; i < M_nb_equivVdt2Asc; i++ )
  286.     {
  287.         if( M_TjeuG2[ i ] .c_vdt == c_vdt )
  288.         {
  289.             return    M_TjeuG2[ i ] .c_ascii;        
  290.         }
  291.     }
  292.  
  293.     /*
  294.      * On a pas trouv‚:
  295.      */
  296.     return    PC8_INVALID;
  297. }
  298.  
  299.  
  300.  
  301.  
  302. /*
  303.  * convert_Compose2Asc(-)
  304.  *
  305.  * Purpose:
  306.  * --------
  307.  * Convertit un caractŠre vid‚otex compos‚ en ascii
  308.  *
  309.  * Algorythm:
  310.  * ----------  
  311.  *    retourne car pc8_invalid si pas trouv‚.
  312.  *
  313.  * Suggest:
  314.  * --------
  315.  * Impl‚menter sous forme de tableau
  316.  *
  317.  * History:
  318.  * --------
  319.  * 23.05.94: fplanque: Created
  320.  */
  321. char    convert_Compose2Asc(         /* Out: caractŠre ‚quivalent */
  322.             char    c_accent,            /* In:  accent … composer */
  323.             char    c_car )                /* In:  caractŠre … composer */
  324. {
  325.     switch( c_accent )
  326.     {
  327.         case    GRAVE:
  328.             switch( c_car )
  329.             {
  330.                 case    'a':
  331.                     return    '…';
  332.                 case    'e':
  333.                     return    'Š';
  334.                 case    'i':
  335.                     return    REZO_INGRAVE;
  336.                 case    'o':
  337.                     return    0x95;
  338.                 case    'u':
  339.                     return    0x97;
  340.                 default:
  341.                     return    c_car;
  342.             }
  343.                         
  344.         case    AIGU:
  345.             switch( c_car )
  346.             {
  347.                 case    'e':
  348.                     return    '‚';
  349.                 case    'i':
  350.                     return    0xA1;
  351.                 case    'o':
  352.                     return    0xA2;
  353.                 case    'u':
  354.                     return    0xA3;
  355.                 case    'E':
  356.                     return    '';
  357.                 default:
  358.                     return    c_car;
  359.             }
  360.                         
  361.         case    CIRC:
  362.             switch( c_car )
  363.             {
  364.                 case    'a':
  365.                     return    'ƒ';
  366.                 case    'e':
  367.                     return    'ˆ';
  368.                 case    'i':
  369.                     return    'Œ';
  370.                 case    'o':
  371.                     return    '“';
  372.                 case    'u':
  373.                     return    '–';
  374.                 default:
  375.                     return    c_car;
  376.             }
  377.                         
  378.         case    TREMA:
  379.             switch( c_car )
  380.             {
  381.                 case    'a':
  382.                     return    0x84;
  383.                 case    'e':
  384.                     return    '‰';
  385.                 case    'i':
  386.                     return    '‹';
  387.                 case    'o':
  388.                     return    0x94;
  389.                 case    'u':
  390.                     return    '';
  391.                 case    'y':
  392.                     return    0x98;
  393.                 case    'A':
  394.                     return    0x8E;
  395.                 case    'O':
  396.                     return    0x99;
  397.                 case    'U':
  398.                     return    0x9A;
  399.                 default:
  400.                     return    c_car;
  401.             }
  402.                         
  403.         case    CEDILLE:
  404.             switch( c_car )
  405.             {
  406.                 case    'c':
  407.                     return    '‡';
  408.                 case    'C':                            /* Non Minitel */
  409.                     return    REZO_CJCEDIL;
  410.                 default:
  411.                     return    c_car;
  412.             }
  413.     
  414.     }
  415.  
  416.     /*
  417.      * On a pas trouv‚:
  418.      * Ne devrait jamais arriver!
  419.      */
  420.     ping();
  421.     return    PC8_INVALID;
  422. }
  423.  
  424.  
  425.